{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import requests  \n",
    "import tushare as ts\n",
    "# 使用示例  \n",
    "pro = ts.pro_api('cd20ec3d07cfc4c30b5cdf36214cc8127ac624cea792a306fcfd5258')\n",
    "data = pro.daily(ts_code = '000333.SZ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-02-27</td>\n",
       "      <td>0.333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-02-28</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-02-29</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-03-01</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-03-02</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>2024-06-04</td>\n",
       "      <td>0.123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>112</th>\n",
       "      <td>2024-06-05</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113</th>\n",
       "      <td>2024-06-05</td>\n",
       "      <td>0.215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>2024-06-05</td>\n",
       "      <td>-0.352</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>115</th>\n",
       "      <td>2024-06-06</td>\n",
       "      <td>-0.321</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>116 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          date  score\n",
       "0   2024-02-27  0.333\n",
       "1   2024-02-28  0.000\n",
       "2   2024-02-29  0.000\n",
       "3   2024-03-01  0.000\n",
       "4   2024-03-02  0.000\n",
       "..         ...    ...\n",
       "111 2024-06-04  0.123\n",
       "112 2024-06-05  0.000\n",
       "113 2024-06-05  0.215\n",
       "114 2024-06-05 -0.352\n",
       "115 2024-06-06 -0.321\n",
       "\n",
       "[116 rows x 2 columns]"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# 读取文件\n",
    "\n",
    "score_data_path = 'daily.xlsx'\n",
    "\n",
    "score_df = pd.read_excel(score_data_path)\n",
    "\n",
    "# 设置日期范围\n",
    "date_range = pd.date_range(start=score_df['date'].min(), end=score_df['date'].max(), freq='D')\n",
    "\n",
    "# 创建一个完整的日期数据框\n",
    "full_date_df = pd.DataFrame(date_range, columns=['date'])\n",
    "\n",
    "# 合并score_df到full_date_df中，缺失值填充为0\n",
    "full_date_df = full_date_df.merge(score_df[['date', 'score']], on='date', how='left').fillna(0)\n",
    "\n",
    "full_date_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trade_date</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2024-02-27</td>\n",
       "      <td>0.333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2024-02-28</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2024-02-29</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2024-03-01</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2024-03-04</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>2024-05-31</td>\n",
       "      <td>-0.321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>2024-06-03</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70</th>\n",
       "      <td>2024-06-04</td>\n",
       "      <td>0.123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>71</th>\n",
       "      <td>2024-06-05</td>\n",
       "      <td>-0.137</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>2024-06-06</td>\n",
       "      <td>-0.321</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>73 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   trade_date  score\n",
       "0  2024-02-27  0.333\n",
       "1  2024-02-28  0.000\n",
       "2  2024-02-29  0.000\n",
       "3  2024-03-01  0.000\n",
       "4  2024-03-04  0.000\n",
       "..        ...    ...\n",
       "68 2024-05-31 -0.321\n",
       "69 2024-06-03  0.000\n",
       "70 2024-06-04  0.123\n",
       "71 2024-06-05 -0.137\n",
       "72 2024-06-06 -0.321\n",
       "\n",
       "[73 rows x 2 columns]"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 处理非工作日，将其推算到下一个工作日\n",
    "full_date_df['next_workday'] = full_date_df['date']\n",
    "full_date_df.loc[full_date_df['next_workday'].dt.dayofweek >= 5, 'next_workday'] = full_date_df['next_workday'] + pd.offsets.BDay()\n",
    "\n",
    "# 将舆情评分推算到下一个工作日\n",
    "workday_scores = full_date_df.groupby('next_workday')['score'].sum().reset_index()\n",
    "workday_scores.columns = ['trade_date', 'score']\n",
    "\n",
    "workday_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ts_code</th>\n",
       "      <th>trade_date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>pre_close</th>\n",
       "      <th>change</th>\n",
       "      <th>pct_chg</th>\n",
       "      <th>vol</th>\n",
       "      <th>amount</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2541</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2013-09-18</td>\n",
       "      <td>40.50</td>\n",
       "      <td>46.40</td>\n",
       "      <td>39.88</td>\n",
       "      <td>42.24</td>\n",
       "      <td>44.56</td>\n",
       "      <td>-2.32</td>\n",
       "      <td>-5.2100</td>\n",
       "      <td>388897.54</td>\n",
       "      <td>1.681303e+06</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2540</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2013-09-23</td>\n",
       "      <td>41.90</td>\n",
       "      <td>46.46</td>\n",
       "      <td>40.67</td>\n",
       "      <td>46.20</td>\n",
       "      <td>42.24</td>\n",
       "      <td>3.96</td>\n",
       "      <td>9.3800</td>\n",
       "      <td>318516.06</td>\n",
       "      <td>1.406018e+06</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2539</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2013-09-24</td>\n",
       "      <td>45.49</td>\n",
       "      <td>46.15</td>\n",
       "      <td>44.40</td>\n",
       "      <td>44.61</td>\n",
       "      <td>46.20</td>\n",
       "      <td>-1.59</td>\n",
       "      <td>-3.4400</td>\n",
       "      <td>200045.14</td>\n",
       "      <td>9.015063e+05</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2538</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2013-09-25</td>\n",
       "      <td>44.01</td>\n",
       "      <td>47.14</td>\n",
       "      <td>44.00</td>\n",
       "      <td>45.05</td>\n",
       "      <td>44.61</td>\n",
       "      <td>0.44</td>\n",
       "      <td>0.9900</td>\n",
       "      <td>171651.36</td>\n",
       "      <td>7.817872e+05</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2537</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2013-09-26</td>\n",
       "      <td>44.65</td>\n",
       "      <td>45.07</td>\n",
       "      <td>42.45</td>\n",
       "      <td>43.00</td>\n",
       "      <td>45.05</td>\n",
       "      <td>-2.05</td>\n",
       "      <td>-4.5500</td>\n",
       "      <td>146808.01</td>\n",
       "      <td>6.400348e+05</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2024-05-31</td>\n",
       "      <td>65.19</td>\n",
       "      <td>65.57</td>\n",
       "      <td>64.55</td>\n",
       "      <td>64.76</td>\n",
       "      <td>65.18</td>\n",
       "      <td>-0.42</td>\n",
       "      <td>-0.6444</td>\n",
       "      <td>261294.19</td>\n",
       "      <td>1.696173e+06</td>\n",
       "      <td>-0.321</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2024-06-03</td>\n",
       "      <td>64.88</td>\n",
       "      <td>66.30</td>\n",
       "      <td>64.27</td>\n",
       "      <td>65.02</td>\n",
       "      <td>64.76</td>\n",
       "      <td>0.26</td>\n",
       "      <td>0.4015</td>\n",
       "      <td>357556.29</td>\n",
       "      <td>2.337234e+06</td>\n",
       "      <td>0.000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2024-06-04</td>\n",
       "      <td>64.99</td>\n",
       "      <td>64.99</td>\n",
       "      <td>63.40</td>\n",
       "      <td>64.68</td>\n",
       "      <td>65.02</td>\n",
       "      <td>-0.34</td>\n",
       "      <td>-0.5229</td>\n",
       "      <td>306211.98</td>\n",
       "      <td>1.969402e+06</td>\n",
       "      <td>0.123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2024-06-05</td>\n",
       "      <td>64.55</td>\n",
       "      <td>65.20</td>\n",
       "      <td>63.80</td>\n",
       "      <td>63.92</td>\n",
       "      <td>64.68</td>\n",
       "      <td>-0.76</td>\n",
       "      <td>-1.1750</td>\n",
       "      <td>283319.25</td>\n",
       "      <td>1.825603e+06</td>\n",
       "      <td>-0.137</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>000333.SZ</td>\n",
       "      <td>2024-06-06</td>\n",
       "      <td>63.80</td>\n",
       "      <td>66.03</td>\n",
       "      <td>63.80</td>\n",
       "      <td>65.76</td>\n",
       "      <td>63.92</td>\n",
       "      <td>1.84</td>\n",
       "      <td>2.8786</td>\n",
       "      <td>436037.19</td>\n",
       "      <td>2.848033e+06</td>\n",
       "      <td>-0.321</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2542 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        ts_code trade_date   open   high    low  close  pre_close  change  \\\n",
       "2541  000333.SZ 2013-09-18  40.50  46.40  39.88  42.24      44.56   -2.32   \n",
       "2540  000333.SZ 2013-09-23  41.90  46.46  40.67  46.20      42.24    3.96   \n",
       "2539  000333.SZ 2013-09-24  45.49  46.15  44.40  44.61      46.20   -1.59   \n",
       "2538  000333.SZ 2013-09-25  44.01  47.14  44.00  45.05      44.61    0.44   \n",
       "2537  000333.SZ 2013-09-26  44.65  45.07  42.45  43.00      45.05   -2.05   \n",
       "...         ...        ...    ...    ...    ...    ...        ...     ...   \n",
       "4     000333.SZ 2024-05-31  65.19  65.57  64.55  64.76      65.18   -0.42   \n",
       "3     000333.SZ 2024-06-03  64.88  66.30  64.27  65.02      64.76    0.26   \n",
       "2     000333.SZ 2024-06-04  64.99  64.99  63.40  64.68      65.02   -0.34   \n",
       "1     000333.SZ 2024-06-05  64.55  65.20  63.80  63.92      64.68   -0.76   \n",
       "0     000333.SZ 2024-06-06  63.80  66.03  63.80  65.76      63.92    1.84   \n",
       "\n",
       "      pct_chg        vol        amount  score  \n",
       "2541  -5.2100  388897.54  1.681303e+06  0.000  \n",
       "2540   9.3800  318516.06  1.406018e+06  0.000  \n",
       "2539  -3.4400  200045.14  9.015063e+05  0.000  \n",
       "2538   0.9900  171651.36  7.817872e+05  0.000  \n",
       "2537  -4.5500  146808.01  6.400348e+05  0.000  \n",
       "...       ...        ...           ...    ...  \n",
       "4     -0.6444  261294.19  1.696173e+06 -0.321  \n",
       "3      0.4015  357556.29  2.337234e+06  0.000  \n",
       "2     -0.5229  306211.98  1.969402e+06  0.123  \n",
       "1     -1.1750  283319.25  1.825603e+06 -0.137  \n",
       "0      2.8786  436037.19  2.848033e+06 -0.321  \n",
       "\n",
       "[2542 rows x 12 columns]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 保留交易日数据\n",
    "data['trade_date'] = pd.to_datetime(data['trade_date'], format='%Y%m%d')\n",
    "workday_scores['trade_date'] = pd.to_datetime(workday_scores['trade_date'])\n",
    "\n",
    "# 合并tushare_df和workday_scores\n",
    "merged_df = data.merge(workday_scores, on='trade_date', how='left').fillna(0)\n",
    "\n",
    "# 按照日期排序\n",
    "merged_df = merged_df.sort_values(by='trade_date')\n",
    "\n",
    "merged_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      ts_code trade_date   open   high    low  close  pre_close  change  \\\n",
      "67  000333.SZ 2024-02-27  60.59  61.99  60.10  61.92      60.30    1.62   \n",
      "66  000333.SZ 2024-02-28  62.00  62.31  60.95  61.82      61.92   -0.10   \n",
      "65  000333.SZ 2024-02-29  62.00  63.48  61.75  62.63      61.82    0.81   \n",
      "64  000333.SZ 2024-03-01  63.50  64.51  62.88  64.47      62.63    1.84   \n",
      "63  000333.SZ 2024-03-04  65.00  66.00  63.50  64.60      64.47    0.13   \n",
      "\n",
      "    pct_chg        vol       amount  score  \n",
      "67   2.6866  280147.95  1720508.595  0.333  \n",
      "66  -0.1615  253673.64  1568616.989  0.000  \n",
      "65   1.3103  489209.98  3071855.396  0.000  \n",
      "64   2.9379  328449.06  2102800.960  0.000  \n",
      "63   0.2016  373843.92  2415284.580  0.000  \n",
      "     ts_code trade_date   open   high    low  close  pre_close  change  \\\n",
      "4  000333.SZ 2024-05-31  65.19  65.57  64.55  64.76      65.18   -0.42   \n",
      "3  000333.SZ 2024-06-03  64.88  66.30  64.27  65.02      64.76    0.26   \n",
      "2  000333.SZ 2024-06-04  64.99  64.99  63.40  64.68      65.02   -0.34   \n",
      "1  000333.SZ 2024-06-05  64.55  65.20  63.80  63.92      64.68   -0.76   \n",
      "0  000333.SZ 2024-06-06  63.80  66.03  63.80  65.76      63.92    1.84   \n",
      "\n",
      "   pct_chg        vol       amount  score  \n",
      "4  -0.6444  261294.19  1696172.930 -0.321  \n",
      "3   0.4015  357556.29  2337233.616  0.000  \n",
      "2  -0.5229  306211.98  1969401.516  0.123  \n",
      "1  -1.1750  283319.25  1825603.150 -0.137  \n",
      "0   2.8786  436037.19  2848032.777 -0.321  \n"
     ]
    }
   ],
   "source": [
    "# 删除早于workday_scores开始日期和晚于score_df结束日期的数据\n",
    "start_date = workday_scores['trade_date'].min()\n",
    "end_date = workday_scores['trade_date'].max()\n",
    "merged_df = merged_df[(merged_df['trade_date'] >= start_date) & (merged_df['trade_date'] <= end_date)]\n",
    "\n",
    "# 显示合并后的数据框\n",
    "print(merged_df.head())\n",
    "\n",
    "# 显示合并后的数据框的后几行\n",
    "print(merged_df.tail())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  after removing the cwd from sys.path.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     vol_lag1   vol_lag2        MA3  RSI7  score  score_lag1  score_lag2  \\\n",
      "67        NaN        NaN        NaN   NaN  0.333         NaN         NaN   \n",
      "66  280147.95        NaN        NaN   NaN  0.000       0.333         NaN   \n",
      "65  253673.64  280147.95        NaN   NaN  0.000       0.000       0.333   \n",
      "64  489209.98  253673.64  62.123333   NaN  0.000       0.000       0.000   \n",
      "63  328449.06  489209.98  62.973333   NaN  0.000       0.000       0.000   \n",
      "\n",
      "    score_MA3  amount_lag1  amount_lag2  ...  low_lag2  close_lag1  \\\n",
      "67        NaN          NaN          NaN  ...       NaN         NaN   \n",
      "66        NaN  1720508.595          NaN  ...       NaN       61.92   \n",
      "65        NaN  1568616.989  1720508.595  ...     60.10       61.82   \n",
      "64      0.111  3071855.396  1568616.989  ...     60.95       62.63   \n",
      "63      0.000  2102800.960  3071855.396  ...     61.75       64.47   \n",
      "\n",
      "    close_lag2  pre_close_lag1  pre_close_lag2  change_lag1  change_lag2  \\\n",
      "67         NaN             NaN             NaN          NaN          NaN   \n",
      "66         NaN           60.30             NaN         1.62          NaN   \n",
      "65       61.92           61.92           60.30        -0.10         1.62   \n",
      "64       61.82           61.82           61.92         0.81        -0.10   \n",
      "63       62.63           62.63           61.82         1.84         0.81   \n",
      "\n",
      "    pct_chg_lag1  pct_chg_lag2  close  \n",
      "67           NaN           NaN  61.92  \n",
      "66        2.6866           NaN  61.82  \n",
      "65       -0.1615        2.6866  62.63  \n",
      "64        1.3103       -0.1615  64.47  \n",
      "63        2.9379        1.3103  64.60  \n",
      "\n",
      "[5 rows x 36 columns]\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "merged_df['trade_date'] = pd.to_datetime(merged_df['trade_date'])\n",
    "merged_df = merged_df.sort_values(by='trade_date')\n",
    "\n",
    "# 添加滞后变量\n",
    "for lag in range(1, 3):\n",
    "    merged_df[f'close_lag{lag}'] = merged_df['close'].shift(lag)\n",
    "    merged_df[f'open_lag{lag}'] = merged_df['open'].shift(lag)\n",
    "    merged_df[f'high_lag{lag}'] = merged_df['high'].shift(lag)\n",
    "    merged_df[f'low_lag{lag}'] = merged_df['low'].shift(lag)\n",
    "    merged_df[f'pre_close_lag{lag}'] = merged_df['pre_close'].shift(lag)\n",
    "    merged_df[f'amount_lag{lag}'] = merged_df['amount'].shift(lag)\n",
    "    merged_df[f'vol_lag{lag}'] = merged_df['vol'].shift(lag)\n",
    "    merged_df[f'score_lag{lag}'] = merged_df['score'].shift(lag)\n",
    "    merged_df[f'change_lag{lag}'] = merged_df['change'].shift(lag)\n",
    "    merged_df[f'pct_chg_lag{lag}'] = merged_df['pct_chg'].shift(lag)\n",
    "\n",
    "# 计算滞后的移动平均线 (MA)\n",
    "merged_df['MA3'] = merged_df['close_lag1'].rolling(window=3).mean()\n",
    "merged_df['score_MA3'] = merged_df['score_lag1'].rolling(window=3).mean()\n",
    "\n",
    "# 计算滞后的相对强弱指数 (RSI)\n",
    "def RSI(series, period=7):\n",
    "    delta = series.diff(1)\n",
    "    gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()\n",
    "    loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()\n",
    "    RS = gain / loss\n",
    "    return 100 - (100 / (1 + RS))\n",
    "\n",
    "merged_df['RSI7'] = RSI(merged_df['close_lag1'], period=7)\n",
    "\n",
    "# 计算滞后的布林带（Bollinger Bands）\n",
    "merged_df['BB_mid'] = merged_df['close_lag1'].rolling(window=3).mean()\n",
    "merged_df['BB_std'] = merged_df['close_lag1'].rolling(window=3).std()\n",
    "merged_df['BB_upper'] = merged_df['BB_mid'] + 2 * merged_df['BB_std']\n",
    "merged_df['BB_lower'] = merged_df['BB_mid'] - 2 * merged_df['BB_std']\n",
    "\n",
    "# 计算滞后的MACD\n",
    "def MACD(series, fast_period=6, slow_period=13, signal_period=5):\n",
    "    fast_ema = series.ewm(span=fast_period, adjust=False).mean()\n",
    "    slow_ema = series.ewm(span=slow_period, adjust=False).mean()\n",
    "    macd = fast_ema - slow_ema\n",
    "    signal = macd.ewm(span=signal_period, adjust=False).mean()\n",
    "    return macd, signal\n",
    "\n",
    "merged_df['MACD'], merged_df['MACD_signal'] = MACD(merged_df['close_lag1'])\n",
    "\n",
    "# 计算滞后的成交量变动率（Volume Change Rate）\n",
    "merged_df['vol_change_rate'] = merged_df['vol_lag1'].pct_change()\n",
    "\n",
    "# 计算滞后的价格波动率\n",
    "merged_df['price_volatility'] = merged_df['high_lag1'] - merged_df['low_lag1']\n",
    "\n",
    "# 计算滞后的价格动量\n",
    "merged_df['price_momentum'] = merged_df['close_lag1'].diff(1)\n",
    "\n",
    "# 计算滞后的成交量比率\n",
    "merged_df['vol_ratio'] = merged_df['vol_lag1'] / merged_df['vol_lag1'].shift(1)\n",
    "\n",
    "# 时间特征\n",
    "merged_df['year'] = merged_df['trade_date'].dt.year\n",
    "merged_df['month'] = merged_df['trade_date'].dt.month\n",
    "merged_df['day_of_week'] = merged_df['trade_date'].dt.dayofweek\n",
    "\n",
    "# 选择特征和目标变量\n",
    "features = [\n",
    "    'vol_lag1', 'vol_lag2', 'MA3', 'RSI7', 'score', 'score_lag1', 'score_lag2', 'score_MA3',\n",
    "    'amount_lag1', 'amount_lag2', 'BB_upper', 'BB_lower', 'MACD', 'MACD_signal', 'vol_change_rate',\n",
    "    'price_volatility', 'price_momentum', 'vol_ratio', 'year', 'month', 'day_of_week',\n",
    "    'open_lag1', 'open_lag2', 'high_lag1', 'high_lag2', 'low_lag1', 'low_lag2',\n",
    "    'close_lag1', 'close_lag2', 'pre_close_lag1', 'pre_close_lag2', 'change_lag1', 'change_lag2', \n",
    "    'pct_chg_lag1', 'pct_chg_lag2'\n",
    "]\n",
    "\n",
    "\n",
    "# 显示添加了特征的DataFrame前几行\n",
    "print(merged_df[features + ['close']].head())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     vol_lag1   vol_lag2        MA3       RSI7  score  score_lag1  score_lag2  \\\n",
      "61  355253.26  373843.92  64.703333  96.987952    0.0         0.0         0.0   \n",
      "60  219230.01  355253.26  64.716667  83.636364    0.0         0.0         0.0   \n",
      "59  306340.33  219230.01  65.116667  87.743191    0.0         0.0         0.0   \n",
      "58  261254.10  306340.33  65.470000  90.074906    0.0         0.0         0.0   \n",
      "57  280270.02  261254.10  65.773333  76.775432    0.0         0.0         0.0   \n",
      "\n",
      "    score_MA3  amount_lag1  amount_lag2  ...  low_lag2  close_lag1  \\\n",
      "61        0.0  2288367.736  2415284.580  ...     63.50       65.04   \n",
      "60        0.0  1422222.516  2288367.736  ...     63.45       64.51   \n",
      "59        0.0  2020641.414  1422222.516  ...     64.30       65.80   \n",
      "58        0.0  1714883.401  2020641.414  ...     64.20       66.10   \n",
      "57        0.0  1826293.592  1714883.401  ...     64.88       65.42   \n",
      "\n",
      "    close_lag2  pre_close_lag1  pre_close_lag2  change_lag1  change_lag2  \\\n",
      "61       64.60           64.60           64.47         0.44         0.13   \n",
      "60       65.04           65.04           64.60        -0.53         0.44   \n",
      "59       64.51           64.51           65.04         1.29        -0.53   \n",
      "58       65.80           65.80           64.51         0.30         1.29   \n",
      "57       66.10           66.10           65.80        -0.68         0.30   \n",
      "\n",
      "    pct_chg_lag1  pct_chg_lag2  close  \n",
      "61        0.6811        0.2016  64.51  \n",
      "60       -0.8149        0.6811  65.80  \n",
      "59        1.9997       -0.8149  66.10  \n",
      "58        0.4559        1.9997  65.42  \n",
      "57       -1.0287        0.4559  64.13  \n",
      "\n",
      "[5 rows x 36 columns]\n"
     ]
    }
   ],
   "source": [
    "# 填补缺失值\n",
    "# merged_df['score'] = merged_df['score'].fillna(merged_df['score'].mean())  # 舆情评分使用均值填充\n",
    "\n",
    "# 其他列可以根据具体情况选择合适的方法\n",
    "# merged_df.fillna(method='ffill', inplace=True)  # 前向填充\n",
    "# merged_df.fillna(method='bfill', inplace=True)  # 后向填充（可选）\n",
    "merged_df = merged_df.dropna()\n",
    "\n",
    "# 选择特征和目标变量 \n",
    "\n",
    "target = 'close'\n",
    "\n",
    "# 显示添加了特征的DataFrame前几行\n",
    "print(merged_df[features + ['close']].head())\n",
    "\n",
    "# 确保没有缺失值\n",
    "assert not merged_df.isnull().any().any(), \"数据中仍存在缺失值，请检查填补方法\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "每列的缺失值数量：\n",
      "Series([], dtype: int64)\n",
      "包含缺失值的行：\n",
      "Empty DataFrame\n",
      "Columns: [ts_code, trade_date, open, high, low, close, pre_close, change, pct_chg, vol, amount, score, close_lag1, open_lag1, high_lag1, low_lag1, pre_close_lag1, amount_lag1, vol_lag1, score_lag1, change_lag1, pct_chg_lag1, close_lag2, open_lag2, high_lag2, low_lag2, pre_close_lag2, amount_lag2, vol_lag2, score_lag2, change_lag2, pct_chg_lag2, MA3, score_MA3, RSI7, BB_mid, BB_std, BB_upper, BB_lower, MACD, MACD_signal, vol_change_rate, price_volatility, price_momentum, vol_ratio, year, month, day_of_week]\n",
      "Index: []\n",
      "\n",
      "[0 rows x 48 columns]\n"
     ]
    }
   ],
   "source": [
    "# 检查数据中是否存在缺失值\n",
    "missing_values = merged_df.isnull().sum()\n",
    "print(\"每列的缺失值数量：\")\n",
    "print(missing_values[missing_values > 0])\n",
    "\n",
    "# 显示包含缺失值的行\n",
    "missing_rows = merged_df[merged_df.isnull().any(axis=1)]\n",
    "print(\"包含缺失值的行：\")\n",
    "print(missing_rows)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "相关系数r值为0.13798398130601697，显著性水平P值为0.28484360897957606\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from scipy.stats import pearsonr\n",
    "\n",
    "# 相关性分析\n",
    "corr, p_value = pearsonr(merged_df['score'], merged_df['close'])\n",
    "print(f'相关系数r值为{corr}，显著性水平P值为{p_value}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             Feature          VIF\n",
      "0           vol_lag1  1297.477135\n",
      "1           vol_lag2  1007.067400\n",
      "2                MA3          inf\n",
      "3               RSI7    16.325980\n",
      "4              score     1.820916\n",
      "5         score_lag1     5.056404\n",
      "6         score_lag2     6.221481\n",
      "7          score_MA3    11.335910\n",
      "8        amount_lag1  1381.945421\n",
      "9        amount_lag2  1054.062927\n",
      "10          BB_upper          inf\n",
      "11          BB_lower          inf\n",
      "12              MACD   116.689424\n",
      "13       MACD_signal    72.959842\n",
      "14   vol_change_rate          inf\n",
      "15  price_volatility          inf\n",
      "16    price_momentum          inf\n",
      "17         vol_ratio          inf\n",
      "18              year          inf\n",
      "19             month     8.294230\n",
      "20       day_of_week     1.514998\n",
      "21         open_lag1   131.713001\n",
      "22         open_lag2   170.853232\n",
      "23         high_lag1          inf\n",
      "24         high_lag2   184.197082\n",
      "25          low_lag1          inf\n",
      "26          low_lag2   128.023479\n",
      "27        close_lag1          inf\n",
      "28        close_lag2          inf\n",
      "29    pre_close_lag1          inf\n",
      "30    pre_close_lag2          inf\n",
      "31       change_lag1          inf\n",
      "32       change_lag2          inf\n",
      "33      pct_chg_lag1   730.756844\n",
      "34      pct_chg_lag2  1048.808523\n",
      "     vol_lag1   vol_lag2        MA3       RSI7  score  score_lag1  score_lag2  \\\n",
      "61  355253.26  373843.92  64.703333  96.987952    0.0         0.0         0.0   \n",
      "60  219230.01  355253.26  64.716667  83.636364    0.0         0.0         0.0   \n",
      "59  306340.33  219230.01  65.116667  87.743191    0.0         0.0         0.0   \n",
      "58  261254.10  306340.33  65.470000  90.074906    0.0         0.0         0.0   \n",
      "57  280270.02  261254.10  65.773333  76.775432    0.0         0.0         0.0   \n",
      "\n",
      "    score_MA3  amount_lag1  amount_lag2  ...  low_lag2  close_lag1  \\\n",
      "61        0.0  2288367.736  2415284.580  ...     63.50       65.04   \n",
      "60        0.0  1422222.516  2288367.736  ...     63.45       64.51   \n",
      "59        0.0  2020641.414  1422222.516  ...     64.30       65.80   \n",
      "58        0.0  1714883.401  2020641.414  ...     64.20       66.10   \n",
      "57        0.0  1826293.592  1714883.401  ...     64.88       65.42   \n",
      "\n",
      "    close_lag2  pre_close_lag1  pre_close_lag2  change_lag1  change_lag2  \\\n",
      "61       64.60           64.60           64.47         0.44         0.13   \n",
      "60       65.04           65.04           64.60        -0.53         0.44   \n",
      "59       64.51           64.51           65.04         1.29        -0.53   \n",
      "58       65.80           65.80           64.51         0.30         1.29   \n",
      "57       66.10           66.10           65.80        -0.68         0.30   \n",
      "\n",
      "    pct_chg_lag1  pct_chg_lag2  close  \n",
      "61        0.6811        0.2016  64.51  \n",
      "60       -0.8149        0.6811  65.80  \n",
      "59        1.9997       -0.8149  66.10  \n",
      "58        0.4559        1.9997  65.42  \n",
      "57       -1.0287        0.4559  64.13  \n",
      "\n",
      "[5 rows x 36 columns]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n"
     ]
    }
   ],
   "source": [
    "# 计算VIF\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "def variance_inflation_factor(X, feature_index):\n",
    "    X = np.array(X)\n",
    "    y = X[:, feature_index]\n",
    "    X = np.delete(X, feature_index, axis=1)\n",
    "    \n",
    "    model = LinearRegression()\n",
    "    model.fit(X, y)\n",
    "    r_squared = model.score(X, y)\n",
    "    \n",
    "    return 1 / (1 - r_squared)\n",
    "\n",
    "# 计算VIF\n",
    "def calculate_vif(X):\n",
    "    vif = pd.DataFrame()\n",
    "    vif[\"Feature\"] = X.columns\n",
    "    vif[\"VIF\"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]\n",
    "    return vif\n",
    "\n",
    "\n",
    "vif_df = calculate_vif(merged_df[features])\n",
    "\n",
    "# 打印VIF\n",
    "print(vif_df)\n",
    "\n",
    "# 显示添加了特征的DataFrame前几行\n",
    "print(merged_df[features + ['close']].head())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`RuntimeWarning: divide by zero encountered in double_scalars` 表示在计算 VIF 时，遇到了除以零的情况。这个警告通常是由于特征间的高度共线性引起的，当特征间的线性关系非常强时，线性回归模型的 R² 值接近 1，从而导致 VIF 值趋向于无穷大 (`inf`)，通常表示这些特征与其他特征具有完美的线性关系。这意味着一个特征可以被其他一个或多个特征完全线性预测。为了找出这些特征的线性关系，我们可以检查这些特征之间的相关性矩阵。\n",
    "\n",
    "### 解决方案\n",
    "\n",
    "1. **移除高度共线性的特征**：通过查看 VIF 值，我们可以识别哪些特征存在高度共线性，并移除这些特征。\n",
    "2. **逐步消除**：逐步移除 VIF 值高于某个阈值（例如10）的特征，直到所有特征的 VIF 值都在合理范围内。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Removing feature 'MA3' with VIF: inf\n",
      "Removing feature 'vol_change_rate' with VIF: inf\n",
      "Removing feature 'price_volatility' with VIF: inf\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Removing feature 'price_momentum' with VIF: inf\n",
      "Removing feature 'year' with VIF: inf\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n",
      "C:\\Users\\15012\\AppData\\Roaming\\Python\\Python36\\site-packages\\ipykernel_launcher.py:13: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  del sys.path[0]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Removing feature 'close_lag1' with VIF: inf\n",
      "Removing feature 'close_lag2' with VIF: inf\n",
      "Removing feature 'amount_lag1' with VIF: 1381.9454206357073\n",
      "Removing feature 'change_lag2' with VIF: 1280.6085162804054\n",
      "Removing feature 'amount_lag2' with VIF: 943.8122206794703\n",
      "Removing feature 'change_lag1' with VIF: 692.606637920991\n",
      "Removing feature 'pre_close_lag2' with VIF: 535.0983089554928\n",
      "Removing feature 'pre_close_lag1' with VIF: 384.234436888148\n",
      "Removing feature 'BB_upper' with VIF: 129.86453110810717\n",
      "Removing feature 'low_lag2' with VIF: 98.80929605158546\n",
      "Removing feature 'high_lag1' with VIF: 86.53526604509904\n",
      "Removing feature 'open_lag1' with VIF: 80.68353359208919\n",
      "Removing feature 'MACD' with VIF: 76.12319624749328\n",
      "Removing feature 'high_lag2' with VIF: 59.23740028220133\n",
      "Removing feature 'low_lag1' with VIF: 26.331430205623633\n",
      "Removing feature 'vol_ratio' with VIF: 25.783388316638963\n",
      "Removing feature 'open_lag2' with VIF: 15.989837966624806\n"
     ]
    }
   ],
   "source": [
    "# 逐步删除VIF值高的特征，并记录被删除的特征\n",
    "def remove_high_vif_features(merged_df, features, threshold=10):\n",
    "    removed_features = []\n",
    "    while True:\n",
    "        vif_df = calculate_vif(merged_df[features])\n",
    "        max_vif = vif_df['VIF'].max()\n",
    "        if max_vif > threshold:\n",
    "            feature_to_remove = vif_df.loc[vif_df['VIF'].idxmax(), 'Feature']\n",
    "            print(f\"Removing feature '{feature_to_remove}' with VIF: {max_vif}\")\n",
    "            removed_features.append((feature_to_remove, max_vif))\n",
    "            features.remove(feature_to_remove)\n",
    "        else:\n",
    "            break\n",
    "    return features, vif_df, removed_features\n",
    "\n",
    "features, final_vif_df, removed_features = remove_high_vif_features(merged_df, features)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Feature</th>\n",
       "      <th>VIF</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>vol_lag1</td>\n",
       "      <td>1.289938</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>vol_lag2</td>\n",
       "      <td>1.191064</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>RSI7</td>\n",
       "      <td>2.426148</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>score</td>\n",
       "      <td>1.304772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>score_lag1</td>\n",
       "      <td>3.016815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>score_lag2</td>\n",
       "      <td>3.905938</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>score_MA3</td>\n",
       "      <td>6.876156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>BB_lower</td>\n",
       "      <td>7.023466</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>MACD_signal</td>\n",
       "      <td>5.818955</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>month</td>\n",
       "      <td>5.112565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>day_of_week</td>\n",
       "      <td>1.141736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>pct_chg_lag1</td>\n",
       "      <td>1.282995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>pct_chg_lag2</td>\n",
       "      <td>1.287345</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         Feature       VIF\n",
       "0       vol_lag1  1.289938\n",
       "1       vol_lag2  1.191064\n",
       "2           RSI7  2.426148\n",
       "3          score  1.304772\n",
       "4     score_lag1  3.016815\n",
       "5     score_lag2  3.905938\n",
       "6      score_MA3  6.876156\n",
       "7       BB_lower  7.023466\n",
       "8    MACD_signal  5.818955\n",
       "9          month  5.112565\n",
       "10   day_of_week  1.141736\n",
       "11  pct_chg_lag1  1.282995\n",
       "12  pct_chg_lag2  1.287345"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "final_vif_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最终的VIF结果：\n",
      "         Feature       VIF\n",
      "0       vol_lag1  1.289938\n",
      "1       vol_lag2  1.191064\n",
      "2           RSI7  2.426148\n",
      "3          score  1.304772\n",
      "4     score_lag1  3.016815\n",
      "5     score_lag2  3.905938\n",
      "6      score_MA3  6.876156\n",
      "7       BB_lower  7.023466\n",
      "8    MACD_signal  5.818955\n",
      "9          month  5.112565\n",
      "10   day_of_week  1.141736\n",
      "11  pct_chg_lag1  1.282995\n",
      "12  pct_chg_lag2  1.287345\n",
      "\n",
      "被删除的特征及其对应的VIF值：\n",
      "Feature: MA3, VIF: inf\n",
      "Feature: vol_change_rate, VIF: inf\n",
      "Feature: price_volatility, VIF: inf\n",
      "Feature: price_momentum, VIF: inf\n",
      "Feature: year, VIF: inf\n",
      "Feature: close_lag1, VIF: inf\n",
      "Feature: close_lag2, VIF: inf\n",
      "Feature: amount_lag1, VIF: 1381.9454206357073\n",
      "Feature: change_lag2, VIF: 1280.6085162804054\n",
      "Feature: amount_lag2, VIF: 943.8122206794703\n",
      "Feature: change_lag1, VIF: 692.606637920991\n",
      "Feature: pre_close_lag2, VIF: 535.0983089554928\n",
      "Feature: pre_close_lag1, VIF: 384.234436888148\n",
      "Feature: BB_upper, VIF: 129.86453110810717\n",
      "Feature: low_lag2, VIF: 98.80929605158546\n",
      "Feature: high_lag1, VIF: 86.53526604509904\n",
      "Feature: open_lag1, VIF: 80.68353359208919\n",
      "Feature: MACD, VIF: 76.12319624749328\n",
      "Feature: high_lag2, VIF: 59.23740028220133\n",
      "Feature: low_lag1, VIF: 26.331430205623633\n",
      "Feature: vol_ratio, VIF: 25.783388316638963\n",
      "Feature: open_lag2, VIF: 15.989837966624806\n"
     ]
    }
   ],
   "source": [
    "# 打印最终的VIF结果\n",
    "print(\"最终的VIF结果：\")\n",
    "print(final_vif_df)\n",
    "\n",
    "# 打印被删除的特征及其对应的VIF值\n",
    "print(\"\\n被删除的特征及其对应的VIF值：\")\n",
    "for feature, vif_value in removed_features:\n",
    "    print(f\"Feature: {feature}, VIF: {vif_value}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 低共线性特征 vs. 高共线性特征的共同特性\n",
    "\n",
    "#### 低共线性特征的共同特性\n",
    "1. **独立性较强**：低共线性的特征相对于其他特征更为独立。例如，`RSI7`、`score`等特征较少受到其他特征的影响，这些特征通常直接衡量市场情绪或股价波动的具体指标。\n",
    "2. **短期内波动较大**：这些特征（如`price_momentum`和`vol_ratio`）可能反映了市场短期内的变化，而不是长期趋势。这使得它们与其他特征的线性关系较弱。\n",
    "3. **直接计算特征**：低共线性的特征通常是直接计算得出的，而不是基于其他特征的计算结果。例如，价格动量是收盘价的差异，而不是像MACD那样复杂的计算结果。\n",
    "4. **较少滞后期**：滞后期较少的特征往往与当前值有更紧密的联系，而不会因为较长的时间跨度而引入更多的共线性。\n",
    "\n",
    "#### 高共线性特征的共同特性\n",
    "1. **基于其他特征计算**：高共线性的特征往往是基于其他特征计算得出的，如`MA3`、`BB_upper`，它们直接或间接依赖于其他多个特征，导致了高度的共线性。\n",
    "2. **长滞后期**：多个滞后期的特征（如`close_lag1`、`close_lag2`）与当前值之间存在高度的相关性，因为它们反映的是同一个变量在不同时间点上的值。\n",
    "3. **重复性强**：许多高共线性的特征是其他特征的重复或变形，如多个滞后期的价格、成交量以及基于这些特征计算的技术指标（如MACD）。\n",
    "4. **涉及长期趋势**：一些高共线性的特征可能涉及到较长时间段内的市场趋势（如`year`），这些特征容易与其他短期特征产生共线性。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>ts_code</th>\n",
       "      <th>trade_date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>pre_close</th>\n",
       "      <th>change</th>\n",
       "      <th>pct_chg</th>\n",
       "      <th>...</th>\n",
       "      <th>BB_lower</th>\n",
       "      <th>MACD</th>\n",
       "      <th>MACD_signal</th>\n",
       "      <th>vol_change_rate</th>\n",
       "      <th>price_volatility</th>\n",
       "      <th>price_momentum</th>\n",
       "      <th>vol_ratio</th>\n",
       "      <th>year</th>\n",
       "      <th>month</th>\n",
       "      <th>day_of_week</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>26</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-12</td>\n",
       "      <td>9.40</td>\n",
       "      <td>10.20</td>\n",
       "      <td>9.36</td>\n",
       "      <td>10.00</td>\n",
       "      <td>9.46</td>\n",
       "      <td>0.54</td>\n",
       "      <td>5.7082</td>\n",
       "      <td>...</td>\n",
       "      <td>8.975871</td>\n",
       "      <td>-0.026655</td>\n",
       "      <td>-0.027663</td>\n",
       "      <td>0.544992</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.28</td>\n",
       "      <td>1.544992</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>25</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-13</td>\n",
       "      <td>9.83</td>\n",
       "      <td>9.87</td>\n",
       "      <td>9.66</td>\n",
       "      <td>9.69</td>\n",
       "      <td>10.00</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>-3.1000</td>\n",
       "      <td>...</td>\n",
       "      <td>8.713040</td>\n",
       "      <td>0.070183</td>\n",
       "      <td>0.004953</td>\n",
       "      <td>1.135519</td>\n",
       "      <td>0.84</td>\n",
       "      <td>0.54</td>\n",
       "      <td>2.135519</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>24</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-14</td>\n",
       "      <td>9.64</td>\n",
       "      <td>9.86</td>\n",
       "      <td>9.60</td>\n",
       "      <td>9.71</td>\n",
       "      <td>9.69</td>\n",
       "      <td>0.02</td>\n",
       "      <td>0.2064</td>\n",
       "      <td>...</td>\n",
       "      <td>9.174695</td>\n",
       "      <td>0.082322</td>\n",
       "      <td>0.030742</td>\n",
       "      <td>-0.417574</td>\n",
       "      <td>0.21</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>0.582426</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>23</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-15</td>\n",
       "      <td>9.62</td>\n",
       "      <td>9.71</td>\n",
       "      <td>9.40</td>\n",
       "      <td>9.47</td>\n",
       "      <td>9.71</td>\n",
       "      <td>-0.24</td>\n",
       "      <td>-2.4717</td>\n",
       "      <td>...</td>\n",
       "      <td>9.453013</td>\n",
       "      <td>0.089250</td>\n",
       "      <td>0.050245</td>\n",
       "      <td>-0.286161</td>\n",
       "      <td>0.26</td>\n",
       "      <td>0.02</td>\n",
       "      <td>0.713839</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>22</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-18</td>\n",
       "      <td>9.46</td>\n",
       "      <td>9.46</td>\n",
       "      <td>9.32</td>\n",
       "      <td>9.44</td>\n",
       "      <td>9.47</td>\n",
       "      <td>-0.03</td>\n",
       "      <td>-0.3168</td>\n",
       "      <td>...</td>\n",
       "      <td>9.357000</td>\n",
       "      <td>0.055564</td>\n",
       "      <td>0.052018</td>\n",
       "      <td>0.046445</td>\n",
       "      <td>0.31</td>\n",
       "      <td>-0.24</td>\n",
       "      <td>1.046445</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>21</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-19</td>\n",
       "      <td>9.39</td>\n",
       "      <td>9.43</td>\n",
       "      <td>9.32</td>\n",
       "      <td>9.33</td>\n",
       "      <td>9.44</td>\n",
       "      <td>-0.11</td>\n",
       "      <td>-1.1653</td>\n",
       "      <td>...</td>\n",
       "      <td>9.244027</td>\n",
       "      <td>0.028386</td>\n",
       "      <td>0.044141</td>\n",
       "      <td>-0.212693</td>\n",
       "      <td>0.14</td>\n",
       "      <td>-0.03</td>\n",
       "      <td>0.787307</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>20</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-20</td>\n",
       "      <td>9.30</td>\n",
       "      <td>9.38</td>\n",
       "      <td>9.26</td>\n",
       "      <td>9.36</td>\n",
       "      <td>9.33</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.3215</td>\n",
       "      <td>...</td>\n",
       "      <td>9.265911</td>\n",
       "      <td>-0.005127</td>\n",
       "      <td>0.027718</td>\n",
       "      <td>-0.154672</td>\n",
       "      <td>0.11</td>\n",
       "      <td>-0.11</td>\n",
       "      <td>0.845328</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>19</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-21</td>\n",
       "      <td>9.36</td>\n",
       "      <td>9.52</td>\n",
       "      <td>9.34</td>\n",
       "      <td>9.40</td>\n",
       "      <td>9.36</td>\n",
       "      <td>0.04</td>\n",
       "      <td>0.4274</td>\n",
       "      <td>...</td>\n",
       "      <td>9.262942</td>\n",
       "      <td>-0.021150</td>\n",
       "      <td>0.011429</td>\n",
       "      <td>-0.238471</td>\n",
       "      <td>0.12</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.761529</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>18</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-22</td>\n",
       "      <td>9.36</td>\n",
       "      <td>9.37</td>\n",
       "      <td>9.17</td>\n",
       "      <td>9.26</td>\n",
       "      <td>9.40</td>\n",
       "      <td>-0.14</td>\n",
       "      <td>-1.4894</td>\n",
       "      <td>...</td>\n",
       "      <td>9.293096</td>\n",
       "      <td>-0.024382</td>\n",
       "      <td>-0.000508</td>\n",
       "      <td>0.579459</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.04</td>\n",
       "      <td>1.579459</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>17</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-25</td>\n",
       "      <td>9.28</td>\n",
       "      <td>9.49</td>\n",
       "      <td>9.18</td>\n",
       "      <td>9.34</td>\n",
       "      <td>9.26</td>\n",
       "      <td>0.08</td>\n",
       "      <td>0.8639</td>\n",
       "      <td>...</td>\n",
       "      <td>9.195778</td>\n",
       "      <td>-0.045366</td>\n",
       "      <td>-0.015461</td>\n",
       "      <td>-0.109259</td>\n",
       "      <td>0.20</td>\n",
       "      <td>-0.14</td>\n",
       "      <td>0.890741</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>16</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-26</td>\n",
       "      <td>9.33</td>\n",
       "      <td>9.52</td>\n",
       "      <td>9.30</td>\n",
       "      <td>9.46</td>\n",
       "      <td>9.34</td>\n",
       "      <td>0.12</td>\n",
       "      <td>1.2848</td>\n",
       "      <td>...</td>\n",
       "      <td>9.192858</td>\n",
       "      <td>-0.044933</td>\n",
       "      <td>-0.025285</td>\n",
       "      <td>0.172773</td>\n",
       "      <td>0.31</td>\n",
       "      <td>0.08</td>\n",
       "      <td>1.172773</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>15</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-27</td>\n",
       "      <td>9.42</td>\n",
       "      <td>9.43</td>\n",
       "      <td>9.20</td>\n",
       "      <td>9.21</td>\n",
       "      <td>9.46</td>\n",
       "      <td>-0.25</td>\n",
       "      <td>-2.6427</td>\n",
       "      <td>...</td>\n",
       "      <td>9.152004</td>\n",
       "      <td>-0.025691</td>\n",
       "      <td>-0.025420</td>\n",
       "      <td>-0.026298</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.12</td>\n",
       "      <td>0.973702</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>14</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-28</td>\n",
       "      <td>9.18</td>\n",
       "      <td>9.32</td>\n",
       "      <td>9.17</td>\n",
       "      <td>9.24</td>\n",
       "      <td>9.21</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.3257</td>\n",
       "      <td>...</td>\n",
       "      <td>9.086600</td>\n",
       "      <td>-0.048576</td>\n",
       "      <td>-0.033139</td>\n",
       "      <td>-0.222878</td>\n",
       "      <td>0.23</td>\n",
       "      <td>-0.25</td>\n",
       "      <td>0.777122</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>13</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-03-29</td>\n",
       "      <td>8.96</td>\n",
       "      <td>9.10</td>\n",
       "      <td>8.89</td>\n",
       "      <td>9.00</td>\n",
       "      <td>9.24</td>\n",
       "      <td>-0.24</td>\n",
       "      <td>-2.5974</td>\n",
       "      <td>...</td>\n",
       "      <td>9.030325</td>\n",
       "      <td>-0.056319</td>\n",
       "      <td>-0.040865</td>\n",
       "      <td>-0.266567</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.733433</td>\n",
       "      <td>2024</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>12</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-01</td>\n",
       "      <td>8.94</td>\n",
       "      <td>9.12</td>\n",
       "      <td>8.92</td>\n",
       "      <td>8.98</td>\n",
       "      <td>9.00</td>\n",
       "      <td>-0.02</td>\n",
       "      <td>-0.2222</td>\n",
       "      <td>...</td>\n",
       "      <td>8.888466</td>\n",
       "      <td>-0.093046</td>\n",
       "      <td>-0.058259</td>\n",
       "      <td>1.207658</td>\n",
       "      <td>0.21</td>\n",
       "      <td>-0.24</td>\n",
       "      <td>2.207658</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>11</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-02</td>\n",
       "      <td>8.90</td>\n",
       "      <td>8.91</td>\n",
       "      <td>8.45</td>\n",
       "      <td>8.50</td>\n",
       "      <td>8.98</td>\n",
       "      <td>-0.48</td>\n",
       "      <td>-5.3452</td>\n",
       "      <td>...</td>\n",
       "      <td>8.783966</td>\n",
       "      <td>-0.114592</td>\n",
       "      <td>-0.077036</td>\n",
       "      <td>-0.029278</td>\n",
       "      <td>0.20</td>\n",
       "      <td>-0.02</td>\n",
       "      <td>0.970722</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>10</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-03</td>\n",
       "      <td>8.40</td>\n",
       "      <td>8.43</td>\n",
       "      <td>8.19</td>\n",
       "      <td>8.19</td>\n",
       "      <td>8.50</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>-3.6471</td>\n",
       "      <td>...</td>\n",
       "      <td>8.260510</td>\n",
       "      <td>-0.191677</td>\n",
       "      <td>-0.115250</td>\n",
       "      <td>1.037766</td>\n",
       "      <td>0.46</td>\n",
       "      <td>-0.48</td>\n",
       "      <td>2.037766</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>9</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-08</td>\n",
       "      <td>8.05</td>\n",
       "      <td>8.10</td>\n",
       "      <td>7.98</td>\n",
       "      <td>8.00</td>\n",
       "      <td>8.19</td>\n",
       "      <td>-0.19</td>\n",
       "      <td>-2.3199</td>\n",
       "      <td>...</td>\n",
       "      <td>7.760593</td>\n",
       "      <td>-0.275334</td>\n",
       "      <td>-0.168611</td>\n",
       "      <td>-0.331482</td>\n",
       "      <td>0.24</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>0.668518</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>8</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-09</td>\n",
       "      <td>8.00</td>\n",
       "      <td>8.06</td>\n",
       "      <td>7.92</td>\n",
       "      <td>7.99</td>\n",
       "      <td>8.00</td>\n",
       "      <td>-0.01</td>\n",
       "      <td>-0.1250</td>\n",
       "      <td>...</td>\n",
       "      <td>7.725223</td>\n",
       "      <td>-0.342458</td>\n",
       "      <td>-0.226560</td>\n",
       "      <td>-0.224057</td>\n",
       "      <td>0.12</td>\n",
       "      <td>-0.19</td>\n",
       "      <td>0.775943</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-10</td>\n",
       "      <td>7.98</td>\n",
       "      <td>7.98</td>\n",
       "      <td>7.48</td>\n",
       "      <td>7.58</td>\n",
       "      <td>7.99</td>\n",
       "      <td>-0.41</td>\n",
       "      <td>-5.1314</td>\n",
       "      <td>...</td>\n",
       "      <td>7.834611</td>\n",
       "      <td>-0.371004</td>\n",
       "      <td>-0.274708</td>\n",
       "      <td>-0.281885</td>\n",
       "      <td>0.14</td>\n",
       "      <td>-0.01</td>\n",
       "      <td>0.718115</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-11</td>\n",
       "      <td>7.42</td>\n",
       "      <td>7.51</td>\n",
       "      <td>7.31</td>\n",
       "      <td>7.44</td>\n",
       "      <td>7.58</td>\n",
       "      <td>-0.14</td>\n",
       "      <td>-1.8470</td>\n",
       "      <td>...</td>\n",
       "      <td>7.377362</td>\n",
       "      <td>-0.431910</td>\n",
       "      <td>-0.327109</td>\n",
       "      <td>1.264138</td>\n",
       "      <td>0.50</td>\n",
       "      <td>-0.41</td>\n",
       "      <td>2.264138</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-12</td>\n",
       "      <td>7.36</td>\n",
       "      <td>7.43</td>\n",
       "      <td>7.09</td>\n",
       "      <td>7.10</td>\n",
       "      <td>7.44</td>\n",
       "      <td>-0.34</td>\n",
       "      <td>-4.5699</td>\n",
       "      <td>...</td>\n",
       "      <td>7.098336</td>\n",
       "      <td>-0.471571</td>\n",
       "      <td>-0.375263</td>\n",
       "      <td>-0.291670</td>\n",
       "      <td>0.20</td>\n",
       "      <td>-0.14</td>\n",
       "      <td>0.708330</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-15</td>\n",
       "      <td>7.02</td>\n",
       "      <td>7.30</td>\n",
       "      <td>7.00</td>\n",
       "      <td>7.14</td>\n",
       "      <td>7.10</td>\n",
       "      <td>0.04</td>\n",
       "      <td>0.5634</td>\n",
       "      <td>...</td>\n",
       "      <td>6.879640</td>\n",
       "      <td>-0.525176</td>\n",
       "      <td>-0.425234</td>\n",
       "      <td>0.343486</td>\n",
       "      <td>0.34</td>\n",
       "      <td>-0.34</td>\n",
       "      <td>1.343486</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-16</td>\n",
       "      <td>7.09</td>\n",
       "      <td>7.25</td>\n",
       "      <td>6.91</td>\n",
       "      <td>7.07</td>\n",
       "      <td>7.14</td>\n",
       "      <td>-0.07</td>\n",
       "      <td>-0.9804</td>\n",
       "      <td>...</td>\n",
       "      <td>6.855004</td>\n",
       "      <td>-0.530846</td>\n",
       "      <td>-0.460438</td>\n",
       "      <td>-0.239433</td>\n",
       "      <td>0.30</td>\n",
       "      <td>0.04</td>\n",
       "      <td>0.760567</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-17</td>\n",
       "      <td>7.05</td>\n",
       "      <td>7.21</td>\n",
       "      <td>7.02</td>\n",
       "      <td>7.10</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0.03</td>\n",
       "      <td>0.4243</td>\n",
       "      <td>...</td>\n",
       "      <td>7.033096</td>\n",
       "      <td>-0.522650</td>\n",
       "      <td>-0.481175</td>\n",
       "      <td>0.205378</td>\n",
       "      <td>0.34</td>\n",
       "      <td>-0.07</td>\n",
       "      <td>1.205378</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-18</td>\n",
       "      <td>7.02</td>\n",
       "      <td>7.05</td>\n",
       "      <td>6.87</td>\n",
       "      <td>6.88</td>\n",
       "      <td>7.10</td>\n",
       "      <td>-0.22</td>\n",
       "      <td>-3.0986</td>\n",
       "      <td>...</td>\n",
       "      <td>7.033096</td>\n",
       "      <td>-0.492014</td>\n",
       "      <td>-0.484788</td>\n",
       "      <td>0.127342</td>\n",
       "      <td>0.19</td>\n",
       "      <td>0.03</td>\n",
       "      <td>1.127342</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>000002.SZ</td>\n",
       "      <td>2024-04-19</td>\n",
       "      <td>6.78</td>\n",
       "      <td>6.85</td>\n",
       "      <td>6.67</td>\n",
       "      <td>6.70</td>\n",
       "      <td>6.88</td>\n",
       "      <td>-0.18</td>\n",
       "      <td>-2.6163</td>\n",
       "      <td>...</td>\n",
       "      <td>6.778060</td>\n",
       "      <td>-0.484603</td>\n",
       "      <td>-0.484726</td>\n",
       "      <td>0.262242</td>\n",
       "      <td>0.18</td>\n",
       "      <td>-0.22</td>\n",
       "      <td>1.262242</td>\n",
       "      <td>2024</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>27 rows × 49 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    Unnamed: 0    ts_code trade_date  open   high   low  close  pre_close  \\\n",
       "26          26  000002.SZ 2024-03-12  9.40  10.20  9.36  10.00       9.46   \n",
       "25          25  000002.SZ 2024-03-13  9.83   9.87  9.66   9.69      10.00   \n",
       "24          24  000002.SZ 2024-03-14  9.64   9.86  9.60   9.71       9.69   \n",
       "23          23  000002.SZ 2024-03-15  9.62   9.71  9.40   9.47       9.71   \n",
       "22          22  000002.SZ 2024-03-18  9.46   9.46  9.32   9.44       9.47   \n",
       "21          21  000002.SZ 2024-03-19  9.39   9.43  9.32   9.33       9.44   \n",
       "20          20  000002.SZ 2024-03-20  9.30   9.38  9.26   9.36       9.33   \n",
       "19          19  000002.SZ 2024-03-21  9.36   9.52  9.34   9.40       9.36   \n",
       "18          18  000002.SZ 2024-03-22  9.36   9.37  9.17   9.26       9.40   \n",
       "17          17  000002.SZ 2024-03-25  9.28   9.49  9.18   9.34       9.26   \n",
       "16          16  000002.SZ 2024-03-26  9.33   9.52  9.30   9.46       9.34   \n",
       "15          15  000002.SZ 2024-03-27  9.42   9.43  9.20   9.21       9.46   \n",
       "14          14  000002.SZ 2024-03-28  9.18   9.32  9.17   9.24       9.21   \n",
       "13          13  000002.SZ 2024-03-29  8.96   9.10  8.89   9.00       9.24   \n",
       "12          12  000002.SZ 2024-04-01  8.94   9.12  8.92   8.98       9.00   \n",
       "11          11  000002.SZ 2024-04-02  8.90   8.91  8.45   8.50       8.98   \n",
       "10          10  000002.SZ 2024-04-03  8.40   8.43  8.19   8.19       8.50   \n",
       "9            9  000002.SZ 2024-04-08  8.05   8.10  7.98   8.00       8.19   \n",
       "8            8  000002.SZ 2024-04-09  8.00   8.06  7.92   7.99       8.00   \n",
       "7            7  000002.SZ 2024-04-10  7.98   7.98  7.48   7.58       7.99   \n",
       "6            6  000002.SZ 2024-04-11  7.42   7.51  7.31   7.44       7.58   \n",
       "5            5  000002.SZ 2024-04-12  7.36   7.43  7.09   7.10       7.44   \n",
       "4            4  000002.SZ 2024-04-15  7.02   7.30  7.00   7.14       7.10   \n",
       "3            3  000002.SZ 2024-04-16  7.09   7.25  6.91   7.07       7.14   \n",
       "2            2  000002.SZ 2024-04-17  7.05   7.21  7.02   7.10       7.07   \n",
       "1            1  000002.SZ 2024-04-18  7.02   7.05  6.87   6.88       7.10   \n",
       "0            0  000002.SZ 2024-04-19  6.78   6.85  6.67   6.70       6.88   \n",
       "\n",
       "    change  pct_chg  ...  BB_lower      MACD  MACD_signal  vol_change_rate  \\\n",
       "26    0.54   5.7082  ...  8.975871 -0.026655    -0.027663         0.544992   \n",
       "25   -0.31  -3.1000  ...  8.713040  0.070183     0.004953         1.135519   \n",
       "24    0.02   0.2064  ...  9.174695  0.082322     0.030742        -0.417574   \n",
       "23   -0.24  -2.4717  ...  9.453013  0.089250     0.050245        -0.286161   \n",
       "22   -0.03  -0.3168  ...  9.357000  0.055564     0.052018         0.046445   \n",
       "21   -0.11  -1.1653  ...  9.244027  0.028386     0.044141        -0.212693   \n",
       "20    0.03   0.3215  ...  9.265911 -0.005127     0.027718        -0.154672   \n",
       "19    0.04   0.4274  ...  9.262942 -0.021150     0.011429        -0.238471   \n",
       "18   -0.14  -1.4894  ...  9.293096 -0.024382    -0.000508         0.579459   \n",
       "17    0.08   0.8639  ...  9.195778 -0.045366    -0.015461        -0.109259   \n",
       "16    0.12   1.2848  ...  9.192858 -0.044933    -0.025285         0.172773   \n",
       "15   -0.25  -2.6427  ...  9.152004 -0.025691    -0.025420        -0.026298   \n",
       "14    0.03   0.3257  ...  9.086600 -0.048576    -0.033139        -0.222878   \n",
       "13   -0.24  -2.5974  ...  9.030325 -0.056319    -0.040865        -0.266567   \n",
       "12   -0.02  -0.2222  ...  8.888466 -0.093046    -0.058259         1.207658   \n",
       "11   -0.48  -5.3452  ...  8.783966 -0.114592    -0.077036        -0.029278   \n",
       "10   -0.31  -3.6471  ...  8.260510 -0.191677    -0.115250         1.037766   \n",
       "9    -0.19  -2.3199  ...  7.760593 -0.275334    -0.168611        -0.331482   \n",
       "8    -0.01  -0.1250  ...  7.725223 -0.342458    -0.226560        -0.224057   \n",
       "7    -0.41  -5.1314  ...  7.834611 -0.371004    -0.274708        -0.281885   \n",
       "6    -0.14  -1.8470  ...  7.377362 -0.431910    -0.327109         1.264138   \n",
       "5    -0.34  -4.5699  ...  7.098336 -0.471571    -0.375263        -0.291670   \n",
       "4     0.04   0.5634  ...  6.879640 -0.525176    -0.425234         0.343486   \n",
       "3    -0.07  -0.9804  ...  6.855004 -0.530846    -0.460438        -0.239433   \n",
       "2     0.03   0.4243  ...  7.033096 -0.522650    -0.481175         0.205378   \n",
       "1    -0.22  -3.0986  ...  7.033096 -0.492014    -0.484788         0.127342   \n",
       "0    -0.18  -2.6163  ...  6.778060 -0.484603    -0.484726         0.262242   \n",
       "\n",
       "    price_volatility  price_momentum  vol_ratio  year  month  day_of_week  \n",
       "26              0.23            0.28   1.544992  2024      3            1  \n",
       "25              0.84            0.54   2.135519  2024      3            2  \n",
       "24              0.21           -0.31   0.582426  2024      3            3  \n",
       "23              0.26            0.02   0.713839  2024      3            4  \n",
       "22              0.31           -0.24   1.046445  2024      3            0  \n",
       "21              0.14           -0.03   0.787307  2024      3            1  \n",
       "20              0.11           -0.11   0.845328  2024      3            2  \n",
       "19              0.12            0.03   0.761529  2024      3            3  \n",
       "18              0.18            0.04   1.579459  2024      3            4  \n",
       "17              0.20           -0.14   0.890741  2024      3            0  \n",
       "16              0.31            0.08   1.172773  2024      3            1  \n",
       "15              0.22            0.12   0.973702  2024      3            2  \n",
       "14              0.23           -0.25   0.777122  2024      3            3  \n",
       "13              0.15            0.03   0.733433  2024      3            4  \n",
       "12              0.21           -0.24   2.207658  2024      4            0  \n",
       "11              0.20           -0.02   0.970722  2024      4            1  \n",
       "10              0.46           -0.48   2.037766  2024      4            2  \n",
       "9               0.24           -0.31   0.668518  2024      4            0  \n",
       "8               0.12           -0.19   0.775943  2024      4            1  \n",
       "7               0.14           -0.01   0.718115  2024      4            2  \n",
       "6               0.50           -0.41   2.264138  2024      4            3  \n",
       "5               0.20           -0.14   0.708330  2024      4            4  \n",
       "4               0.34           -0.34   1.343486  2024      4            0  \n",
       "3               0.30            0.04   0.760567  2024      4            1  \n",
       "2               0.34           -0.07   1.205378  2024      4            2  \n",
       "1               0.19            0.03   1.127342  2024      4            3  \n",
       "0               0.18           -0.22   1.262242  2024      4            4  \n",
       "\n",
       "[27 rows x 49 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "merged_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import mean_squared_error, r2_score\n",
    "\n",
    "# 使用基于VIF筛选的特征定义X\n",
    "X = merged_df[features]\n",
    "y = merged_df['close']\n",
    "\n",
    "# 分割数据集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
    "#X_test, X_train, y_test, y_train = train_test_split(X, y, test_size=0.7, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>vol_lag1</th>\n",
       "      <th>vol_lag2</th>\n",
       "      <th>RSI7</th>\n",
       "      <th>score</th>\n",
       "      <th>score_lag1</th>\n",
       "      <th>score_lag2</th>\n",
       "      <th>score_MA3</th>\n",
       "      <th>BB_lower</th>\n",
       "      <th>MACD_signal</th>\n",
       "      <th>month</th>\n",
       "      <th>day_of_week</th>\n",
       "      <th>pct_chg_lag1</th>\n",
       "      <th>pct_chg_lag2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>254639.04</td>\n",
       "      <td>315316.77</td>\n",
       "      <td>44.591611</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>63.668904</td>\n",
       "      <td>0.465017</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.7442</td>\n",
       "      <td>0.6711</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>327231.64</td>\n",
       "      <td>507399.15</td>\n",
       "      <td>44.226580</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>63.014615</td>\n",
       "      <td>0.673233</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>-0.0936</td>\n",
       "      <td>-1.9719</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>288123.35</td>\n",
       "      <td>395421.36</td>\n",
       "      <td>94.805195</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.675</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.225000</td>\n",
       "      <td>67.886992</td>\n",
       "      <td>1.082447</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>2.0706</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57</th>\n",
       "      <td>280270.02</td>\n",
       "      <td>261254.10</td>\n",
       "      <td>76.775432</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>65.091767</td>\n",
       "      <td>0.839812</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.0287</td>\n",
       "      <td>0.4559</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>399236.10</td>\n",
       "      <td>271674.10</td>\n",
       "      <td>59.636364</td>\n",
       "      <td>-0.333</td>\n",
       "      <td>-0.457</td>\n",
       "      <td>1.131</td>\n",
       "      <td>0.349667</td>\n",
       "      <td>69.936074</td>\n",
       "      <td>1.005144</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>-2.5719</td>\n",
       "      <td>1.1547</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>327712.25</td>\n",
       "      <td>254688.58</td>\n",
       "      <td>92.000000</td>\n",
       "      <td>0.753</td>\n",
       "      <td>2.468</td>\n",
       "      <td>1.450</td>\n",
       "      <td>1.825000</td>\n",
       "      <td>62.874500</td>\n",
       "      <td>0.165280</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>3.1143</td>\n",
       "      <td>-0.5574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>240961.49</td>\n",
       "      <td>261052.15</td>\n",
       "      <td>5.729167</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>64.726799</td>\n",
       "      <td>-0.716791</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>0.5045</td>\n",
       "      <td>-1.7130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>242257.47</td>\n",
       "      <td>220332.98</td>\n",
       "      <td>47.368421</td>\n",
       "      <td>1.574</td>\n",
       "      <td>0.200</td>\n",
       "      <td>0.237</td>\n",
       "      <td>0.037333</td>\n",
       "      <td>67.684614</td>\n",
       "      <td>0.832178</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0.1905</td>\n",
       "      <td>0.5007</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>259269.68</td>\n",
       "      <td>240961.49</td>\n",
       "      <td>21.762590</td>\n",
       "      <td>0.123</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>64.672360</td>\n",
       "      <td>-0.823077</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>1.3386</td>\n",
       "      <td>0.5045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>176619.60</td>\n",
       "      <td>304314.57</td>\n",
       "      <td>86.632391</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.723</td>\n",
       "      <td>0.389000</td>\n",
       "      <td>70.589832</td>\n",
       "      <td>0.859488</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>-0.4923</td>\n",
       "      <td>0.1267</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>261294.19</td>\n",
       "      <td>193586.23</td>\n",
       "      <td>43.512974</td>\n",
       "      <td>0.000</td>\n",
       "      <td>-0.321</td>\n",
       "      <td>0.000</td>\n",
       "      <td>-0.066000</td>\n",
       "      <td>64.163818</td>\n",
       "      <td>-0.843363</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.6444</td>\n",
       "      <td>-1.0175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>253537.49</td>\n",
       "      <td>269033.26</td>\n",
       "      <td>39.969136</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>62.462883</td>\n",
       "      <td>-0.382784</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.2862</td>\n",
       "      <td>0.4471</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>304314.57</td>\n",
       "      <td>461799.14</td>\n",
       "      <td>83.622829</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.723</td>\n",
       "      <td>0.444</td>\n",
       "      <td>0.459000</td>\n",
       "      <td>69.155008</td>\n",
       "      <td>0.812954</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>0.1267</td>\n",
       "      <td>1.7627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>317837.41</td>\n",
       "      <td>217343.88</td>\n",
       "      <td>56.512141</td>\n",
       "      <td>0.325</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>63.444727</td>\n",
       "      <td>0.462479</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>3.0051</td>\n",
       "      <td>-0.2766</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>217343.88</td>\n",
       "      <td>190047.69</td>\n",
       "      <td>24.521073</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>64.759549</td>\n",
       "      <td>0.442816</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.2766</td>\n",
       "      <td>-0.1534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>180819.70</td>\n",
       "      <td>194782.79</td>\n",
       "      <td>56.289979</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.123000</td>\n",
       "      <td>64.896429</td>\n",
       "      <td>0.572982</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>0.1999</td>\n",
       "      <td>-0.4287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>271674.10</td>\n",
       "      <td>224879.05</td>\n",
       "      <td>93.282150</td>\n",
       "      <td>-0.457</td>\n",
       "      <td>1.131</td>\n",
       "      <td>0.375</td>\n",
       "      <td>0.502000</td>\n",
       "      <td>71.170484</td>\n",
       "      <td>1.047380</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>1.1547</td>\n",
       "      <td>0.0418</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>377908.90</td>\n",
       "      <td>297946.18</td>\n",
       "      <td>13.729508</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>61.546788</td>\n",
       "      <td>-0.076422</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>-1.1502</td>\n",
       "      <td>0.3849</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>289437.54</td>\n",
       "      <td>288123.35</td>\n",
       "      <td>96.233522</td>\n",
       "      <td>0.123</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.675</td>\n",
       "      <td>0.225000</td>\n",
       "      <td>69.970239</td>\n",
       "      <td>1.198082</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.0286</td>\n",
       "      <td>0.0000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>191736.67</td>\n",
       "      <td>305462.19</td>\n",
       "      <td>40.671642</td>\n",
       "      <td>0.123</td>\n",
       "      <td>-0.367</td>\n",
       "      <td>0.123</td>\n",
       "      <td>-0.081333</td>\n",
       "      <td>66.106142</td>\n",
       "      <td>-0.762696</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.8285</td>\n",
       "      <td>1.4560</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>224879.05</td>\n",
       "      <td>285718.31</td>\n",
       "      <td>88.571429</td>\n",
       "      <td>1.131</td>\n",
       "      <td>0.375</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.125000</td>\n",
       "      <td>70.205493</td>\n",
       "      <td>0.980949</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0418</td>\n",
       "      <td>1.5548</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>332263.98</td>\n",
       "      <td>242257.47</td>\n",
       "      <td>17.153285</td>\n",
       "      <td>0.210</td>\n",
       "      <td>1.574</td>\n",
       "      <td>0.200</td>\n",
       "      <td>0.670333</td>\n",
       "      <td>68.092236</td>\n",
       "      <td>0.713861</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.2486</td>\n",
       "      <td>0.1905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>245496.49</td>\n",
       "      <td>391913.80</td>\n",
       "      <td>87.214612</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.325</td>\n",
       "      <td>0.108333</td>\n",
       "      <td>66.037141</td>\n",
       "      <td>0.724893</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>0.3953</td>\n",
       "      <td>2.1993</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>301894.55</td>\n",
       "      <td>399236.10</td>\n",
       "      <td>38.317757</td>\n",
       "      <td>0.000</td>\n",
       "      <td>-0.333</td>\n",
       "      <td>-0.457</td>\n",
       "      <td>0.113667</td>\n",
       "      <td>68.118282</td>\n",
       "      <td>0.860060</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>2.7999</td>\n",
       "      <td>-2.5719</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>219230.01</td>\n",
       "      <td>355253.26</td>\n",
       "      <td>83.636364</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>64.149451</td>\n",
       "      <td>0.568060</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>-0.8149</td>\n",
       "      <td>0.6811</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>206264.95</td>\n",
       "      <td>226536.32</td>\n",
       "      <td>89.002037</td>\n",
       "      <td>0.369</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.753</td>\n",
       "      <td>1.073667</td>\n",
       "      <td>65.827636</td>\n",
       "      <td>0.542129</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0.7245</td>\n",
       "      <td>0.0453</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>306340.33</td>\n",
       "      <td>219230.01</td>\n",
       "      <td>87.743191</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>63.819850</td>\n",
       "      <td>0.684271</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>1.9997</td>\n",
       "      <td>-0.8149</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>426430.37</td>\n",
       "      <td>418482.56</td>\n",
       "      <td>12.285714</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.956</td>\n",
       "      <td>0.564</td>\n",
       "      <td>0.506667</td>\n",
       "      <td>65.208647</td>\n",
       "      <td>0.088904</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>-2.1461</td>\n",
       "      <td>-1.8892</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>461799.14</td>\n",
       "      <td>571318.43</td>\n",
       "      <td>59.312839</td>\n",
       "      <td>0.723</td>\n",
       "      <td>0.444</td>\n",
       "      <td>0.210</td>\n",
       "      <td>0.742667</td>\n",
       "      <td>66.846077</td>\n",
       "      <td>0.735557</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>1.7627</td>\n",
       "      <td>2.3167</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>220332.98</td>\n",
       "      <td>307830.47</td>\n",
       "      <td>49.152542</td>\n",
       "      <td>0.200</td>\n",
       "      <td>0.237</td>\n",
       "      <td>-0.325</td>\n",
       "      <td>0.011667</td>\n",
       "      <td>67.674538</td>\n",
       "      <td>0.951882</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>0.5007</td>\n",
       "      <td>-0.7165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>194782.79</td>\n",
       "      <td>324344.92</td>\n",
       "      <td>62.522852</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.369</td>\n",
       "      <td>0.123000</td>\n",
       "      <td>63.885111</td>\n",
       "      <td>0.610514</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.4287</td>\n",
       "      <td>-2.1130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>306211.98</td>\n",
       "      <td>357556.29</td>\n",
       "      <td>27.954545</td>\n",
       "      <td>-0.137</td>\n",
       "      <td>0.123</td>\n",
       "      <td>0.000</td>\n",
       "      <td>-0.066000</td>\n",
       "      <td>64.464472</td>\n",
       "      <td>-0.891530</td>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.5229</td>\n",
       "      <td>0.4015</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>297946.18</td>\n",
       "      <td>425011.13</td>\n",
       "      <td>13.842975</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>61.198972</td>\n",
       "      <td>0.105566</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0.3849</td>\n",
       "      <td>-2.5929</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>324344.92</td>\n",
       "      <td>206264.95</td>\n",
       "      <td>71.172638</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.369</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.374000</td>\n",
       "      <td>64.666264</td>\n",
       "      <td>0.615034</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>-2.1130</td>\n",
       "      <td>0.7245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>254688.58</td>\n",
       "      <td>451854.11</td>\n",
       "      <td>69.243421</td>\n",
       "      <td>2.468</td>\n",
       "      <td>1.450</td>\n",
       "      <td>1.557</td>\n",
       "      <td>1.002333</td>\n",
       "      <td>63.240079</td>\n",
       "      <td>-0.033176</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.5574</td>\n",
       "      <td>1.4292</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>283319.25</td>\n",
       "      <td>306211.98</td>\n",
       "      <td>6.205251</td>\n",
       "      <td>-0.321</td>\n",
       "      <td>-0.137</td>\n",
       "      <td>0.123</td>\n",
       "      <td>-0.004667</td>\n",
       "      <td>63.413590</td>\n",
       "      <td>-0.927571</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>-1.1750</td>\n",
       "      <td>-0.5229</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>226536.32</td>\n",
       "      <td>327712.25</td>\n",
       "      <td>88.535032</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.753</td>\n",
       "      <td>2.468</td>\n",
       "      <td>1.557000</td>\n",
       "      <td>63.236418</td>\n",
       "      <td>0.360644</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0453</td>\n",
       "      <td>3.1143</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>315316.77</td>\n",
       "      <td>327231.64</td>\n",
       "      <td>44.104803</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>63.767572</td>\n",
       "      <td>0.574999</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>0.6711</td>\n",
       "      <td>-0.0936</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>285718.31</td>\n",
       "      <td>176619.60</td>\n",
       "      <td>88.817204</td>\n",
       "      <td>0.375</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.241000</td>\n",
       "      <td>70.109352</td>\n",
       "      <td>0.926830</td>\n",
       "      <td>5</td>\n",
       "      <td>4</td>\n",
       "      <td>1.5548</td>\n",
       "      <td>-0.4923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>269033.26</td>\n",
       "      <td>431567.77</td>\n",
       "      <td>38.200590</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>59.456130</td>\n",
       "      <td>-0.403133</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0.4471</td>\n",
       "      <td>3.4187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>391913.80</td>\n",
       "      <td>317837.41</td>\n",
       "      <td>64.311594</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.325</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.108333</td>\n",
       "      <td>63.248790</td>\n",
       "      <td>0.580381</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>2.1993</td>\n",
       "      <td>3.0051</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>261052.15</td>\n",
       "      <td>243587.94</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.000</td>\n",
       "      <td>0.318667</td>\n",
       "      <td>64.848610</td>\n",
       "      <td>-0.495909</td>\n",
       "      <td>5</td>\n",
       "      <td>3</td>\n",
       "      <td>-1.7130</td>\n",
       "      <td>-0.0300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>571318.43</td>\n",
       "      <td>332263.98</td>\n",
       "      <td>47.453704</td>\n",
       "      <td>0.444</td>\n",
       "      <td>0.210</td>\n",
       "      <td>1.574</td>\n",
       "      <td>0.661333</td>\n",
       "      <td>67.048706</td>\n",
       "      <td>0.680147</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>2.3167</td>\n",
       "      <td>-0.2486</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     vol_lag1   vol_lag2       RSI7  score  score_lag1  score_lag2  score_MA3  \\\n",
       "53  254639.04  315316.77  44.591611  0.000       0.000       0.000   0.000000   \n",
       "55  327231.64  507399.15  44.226580  0.000       0.000       0.000   0.000000   \n",
       "30  288123.35  395421.36  94.805195  0.000       0.675       0.000   0.225000   \n",
       "57  280270.02  261254.10  76.775432  0.000       0.000       0.000   0.000000   \n",
       "16  399236.10  271674.10  59.636364 -0.333      -0.457       1.131   0.349667   \n",
       "42  327712.25  254688.58  92.000000  0.753       2.468       1.450   1.825000   \n",
       "9   240961.49  261052.15   5.729167  0.000       0.000       0.000   0.000000   \n",
       "25  242257.47  220332.98  47.368421  1.574       0.200       0.237   0.037333   \n",
       "8   259269.68  240961.49  21.762590  0.123       0.000       0.000   0.000000   \n",
       "20  176619.60  304314.57  86.632391  0.000       0.000       0.723   0.389000   \n",
       "3   261294.19  193586.23  43.512974  0.000      -0.321       0.000  -0.066000   \n",
       "46  253537.49  269033.26  39.969136  0.000       0.000       0.000   0.000000   \n",
       "21  304314.57  461799.14  83.622829  0.000       0.723       0.444   0.459000   \n",
       "34  317837.41  217343.88  56.512141  0.325       0.000       0.000   0.000000   \n",
       "35  217343.88  190047.69  24.521073  0.000       0.000       0.000   0.000000   \n",
       "37  180819.70  194782.79  56.289979  0.000       0.000       0.000   0.123000   \n",
       "17  271674.10  224879.05  93.282150 -0.457       1.131       0.375   0.502000   \n",
       "50  377908.90  297946.18  13.729508  0.000       0.000       0.000   0.000000   \n",
       "29  289437.54  288123.35  96.233522  0.123       0.000       0.675   0.225000   \n",
       "6   191736.67  305462.19  40.671642  0.123      -0.367       0.123  -0.081333   \n",
       "18  224879.05  285718.31  88.571429  1.131       0.375       0.000   0.125000   \n",
       "24  332263.98  242257.47  17.153285  0.210       1.574       0.200   0.670333   \n",
       "32  245496.49  391913.80  87.214612  0.000       0.000       0.325   0.108333   \n",
       "15  301894.55  399236.10  38.317757  0.000      -0.333      -0.457   0.113667   \n",
       "60  219230.01  355253.26  83.636364  0.000       0.000       0.000   0.000000   \n",
       "40  206264.95  226536.32  89.002037  0.369       0.000       0.753   1.073667   \n",
       "59  306340.33  219230.01  87.743191  0.000       0.000       0.000   0.000000   \n",
       "12  426430.37  418482.56  12.285714  0.000       0.956       0.564   0.506667   \n",
       "22  461799.14  571318.43  59.312839  0.723       0.444       0.210   0.742667   \n",
       "26  220332.98  307830.47  49.152542  0.200       0.237      -0.325   0.011667   \n",
       "38  194782.79  324344.92  62.522852  0.000       0.000       0.369   0.123000   \n",
       "1   306211.98  357556.29  27.954545 -0.137       0.123       0.000  -0.066000   \n",
       "51  297946.18  425011.13  13.842975  0.000       0.000       0.000   0.000000   \n",
       "39  324344.92  206264.95  71.172638  0.000       0.369       0.000   0.374000   \n",
       "43  254688.58  451854.11  69.243421  2.468       1.450       1.557   1.002333   \n",
       "0   283319.25  306211.98   6.205251 -0.321      -0.137       0.123  -0.004667   \n",
       "41  226536.32  327712.25  88.535032  0.000       0.753       2.468   1.557000   \n",
       "54  315316.77  327231.64  44.104803  0.000       0.000       0.000   0.000000   \n",
       "19  285718.31  176619.60  88.817204  0.375       0.000       0.000   0.241000   \n",
       "47  269033.26  431567.77  38.200590  0.000       0.000       0.000   0.000000   \n",
       "33  391913.80  317837.41  64.311594  0.000       0.325       0.000   0.108333   \n",
       "10  261052.15  243587.94   0.000000  0.000       0.000       0.000   0.318667   \n",
       "23  571318.43  332263.98  47.453704  0.444       0.210       1.574   0.661333   \n",
       "\n",
       "     BB_lower  MACD_signal  month  day_of_week  pct_chg_lag1  pct_chg_lag2  \n",
       "53  63.668904     0.465017      3            0       -0.7442        0.6711  \n",
       "55  63.014615     0.673233      3            3       -0.0936       -1.9719  \n",
       "30  67.886992     1.082447      4            0        0.0000        2.0706  \n",
       "57  65.091767     0.839812      3            1       -1.0287        0.4559  \n",
       "16  69.936074     1.005144      5            2       -2.5719        1.1547  \n",
       "42  62.874500     0.165280      4            1        3.1143       -0.5574  \n",
       "9   64.726799    -0.716791      5            4        0.5045       -1.7130  \n",
       "25  67.684614     0.832178      4            0        0.1905        0.5007  \n",
       "8   64.672360    -0.823077      5            0        1.3386        0.5045  \n",
       "20  70.589832     0.859488      5            3       -0.4923        0.1267  \n",
       "3   64.163818    -0.843363      6            0       -0.6444       -1.0175  \n",
       "46  62.462883    -0.382784      3            2       -0.2862        0.4471  \n",
       "21  69.155008     0.812954      5            2        0.1267        1.7627  \n",
       "34  63.444727     0.462479      4            1        3.0051       -0.2766  \n",
       "35  64.759549     0.442816      4            0       -0.2766       -0.1534  \n",
       "37  64.896429     0.572982      4            3        0.1999       -0.4287  \n",
       "17  71.170484     1.047380      5            1        1.1547        0.0418  \n",
       "50  61.546788    -0.076422      3            3       -1.1502        0.3849  \n",
       "29  69.970239     1.198082      4            1       -0.0286        0.0000  \n",
       "6   66.106142    -0.762696      5            2       -0.8285        1.4560  \n",
       "18  70.205493     0.980949      5            0        0.0418        1.5548  \n",
       "24  68.092236     0.713861      4            1       -0.2486        0.1905  \n",
       "32  66.037141     0.724893      4            3        0.3953        2.1993  \n",
       "15  68.118282     0.860060      5            3        2.7999       -2.5719  \n",
       "60  64.149451     0.568060      3            3       -0.8149        0.6811  \n",
       "40  65.827636     0.542129      4            0        0.7245        0.0453  \n",
       "59  63.819850     0.684271      3            4        1.9997       -0.8149  \n",
       "12  65.208647     0.088904      5            1       -2.1461       -1.8892  \n",
       "22  66.846077     0.735557      5            1        1.7627        2.3167  \n",
       "26  67.674538     0.951882      4            4        0.5007       -0.7165  \n",
       "38  63.885111     0.610514      4            2       -0.4287       -2.1130  \n",
       "1   64.464472    -0.891530      6            2       -0.5229        0.4015  \n",
       "51  61.198972     0.105566      3            2        0.3849       -2.5929  \n",
       "39  64.666264     0.615034      4            1       -2.1130        0.7245  \n",
       "43  63.240079    -0.033176      4            0       -0.5574        1.4292  \n",
       "0   63.413590    -0.927571      6            3       -1.1750       -0.5229  \n",
       "41  63.236418     0.360644      4            2        0.0453        3.1143  \n",
       "54  63.767572     0.574999      3            4        0.6711       -0.0936  \n",
       "19  70.109352     0.926830      5            4        1.5548       -0.4923  \n",
       "47  59.456130    -0.403133      3            1        0.4471        3.4187  \n",
       "33  63.248790     0.580381      4            2        2.1993        3.0051  \n",
       "10  64.848610    -0.495909      5            3       -1.7130       -0.0300  \n",
       "23  67.048706     0.680147      5            0        2.3167       -0.2486  "
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: Linear Regression\n",
      "Mean Squared Error: 2.24205120830888\n",
      "R^2 Score: 0.42469435265714206\n",
      "\n",
      "Model: Random Forest\n",
      "Mean Squared Error: 0.9189989142105467\n",
      "R^2 Score: 0.7641868021176597\n",
      "\n",
      "Model: Gradient Boosting\n",
      "Mean Squared Error: 1.2326140257042433\n",
      "R^2 Score: 0.683713820918237\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 定义模型\n",
    "models = {\n",
    "    'Linear Regression': LinearRegression(),\n",
    "    'Random Forest': RandomForestRegressor(n_estimators=100, random_state=42),\n",
    "    'Gradient Boosting': GradientBoostingRegressor(n_estimators=100, random_state=42)\n",
    "}\n",
    "\n",
    "# 训练模型并评估\n",
    "results = {}\n",
    "\n",
    "for name, model in models.items():\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    mse = mean_squared_error(y_test, y_pred)\n",
    "    r2 = r2_score(y_test, y_pred)\n",
    "    results[name] = {'MSE': mse, 'R2': r2}\n",
    "\n",
    "# 打印结果\n",
    "for name, result in results.items():\n",
    "    print(f\"Model: {name}\")\n",
    "    print(f\"Mean Squared Error: {result['MSE']}\")\n",
    "    print(f\"R^2 Score: {result['R2']}\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: Linear Regression\n",
      "Mean Squared Error (Cross-validated): 1.7066100319559556\n",
      "Standard Deviation (MSE): 0.6548305027916335\n",
      "R^2 Score (Cross-validated): 0.7397113924877525\n",
      "Standard Deviation (R^2): 0.13923228317094138\n",
      "R^2 Score (Whole Data): 0.4246943526571463\n",
      "\n",
      "Model: Random Forest\n",
      "Mean Squared Error (Cross-validated): 2.6877041171111373\n",
      "Standard Deviation (MSE): 1.4006089616036175\n",
      "R^2 Score (Cross-validated): 0.5681138328992953\n",
      "Standard Deviation (R^2): 0.2704133269997395\n",
      "R^2 Score (Whole Data): 0.7641875508433419\n",
      "\n",
      "Model: Gradient Boosting\n",
      "Mean Squared Error (Cross-validated): 3.4310984015828523\n",
      "Standard Deviation (MSE): 1.7512862732660088\n",
      "R^2 Score (Cross-validated): 0.43775131559459013\n",
      "Standard Deviation (R^2): 0.34122139889447034\n",
      "R^2 Score (Whole Data): 0.683713820918237\n",
      "\n",
      "表现最佳的模型是: Linear Regression\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.model_selection import cross_val_score, KFold\n",
    "from sklearn.metrics import make_scorer\n",
    "\n",
    "# 定义模型和管道\n",
    "models = {\n",
    "    'Linear Regression': Pipeline([('scaler', StandardScaler()), ('lr', LinearRegression())]),\n",
    "    'Random Forest': Pipeline([('scaler', StandardScaler()), ('rf', RandomForestRegressor(n_estimators=100, random_state=42))]),\n",
    "    'Gradient Boosting': Pipeline([('scaler', StandardScaler()), ('gb', GradientBoostingRegressor(n_estimators=100, random_state=42))])\n",
    "}\n",
    "\n",
    "# 交叉验证\n",
    "kf = KFold(n_splits=5, shuffle=True, random_state=42)\n",
    "results = {}\n",
    "\n",
    "for name, model in models.items():\n",
    "    mse_scorer = make_scorer(mean_squared_error, greater_is_better=False)\n",
    "    r2_scorer = make_scorer(r2_score)\n",
    "    \n",
    "    # 交叉验证评估模型\n",
    "    mse_cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring=mse_scorer)\n",
    "    r2_cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring=r2_scorer)\n",
    "    \n",
    "    # 在整个数据集上评估模型\n",
    "    model.fit(X_train, y_train)\n",
    "    r2_score_whole_data = model.score(X_test, y_test)\n",
    "    \n",
    "    # 存储结果\n",
    "    results[name] = {\n",
    "        'MSE': -mse_cv_scores.mean(),\n",
    "        'MSE Std': mse_cv_scores.std(),\n",
    "        'R^2 CV': r2_cv_scores.mean(),\n",
    "        'R^2 Std': r2_cv_scores.std(),\n",
    "        'R^2 Whole Data': r2_score_whole_data\n",
    "    }\n",
    "\n",
    "# 打印结果\n",
    "for name, result in results.items():\n",
    "    print(f\"Model: {name}\")\n",
    "    print(f\"Mean Squared Error (Cross-validated): {result['MSE']}\")\n",
    "    print(f\"Standard Deviation (MSE): {result['MSE Std']}\")\n",
    "    print(f\"R^2 Score (Cross-validated): {result['R^2 CV']}\")\n",
    "    print(f\"Standard Deviation (R^2): {result['R^2 Std']}\")\n",
    "    print(f\"R^2 Score (Whole Data): {result['R^2 Whole Data']}\\n\")\n",
    "    \n",
    "# 找到交叉验证中表现最佳的模型\n",
    "best_model_name = min(results, key=lambda x: results[x]['MSE'])\n",
    "best_model = models[best_model_name]\n",
    "\n",
    "print(f\"表现最佳的模型是: {best_model_name}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   trade_date  close  Predicted_Close\n",
      "61 2024-03-06  64.51        64.500798\n",
      "60 2024-03-07  65.80        64.420279\n",
      "59 2024-03-08  66.10        65.538076\n",
      "58 2024-03-11  65.42        65.484662\n",
      "57 2024-03-12  64.13        64.722657\n",
      "..        ...    ...              ...\n",
      "4  2024-05-31  64.76        64.158500\n",
      "3  2024-06-03  65.02        64.997967\n",
      "2  2024-06-04  64.68        66.227860\n",
      "1  2024-06-05  63.92        66.719584\n",
      "0  2024-06-06  65.76        65.427868\n",
      "\n",
      "[62 rows x 3 columns]\n"
     ]
    }
   ],
   "source": [
    "# 生成各个模型的预测股价\n",
    "merged_df['Predicted_Close'] = best_model.predict(X)\n",
    "\n",
    "# 输出包含实际股价和预测股价的表格\n",
    "prediction_table = merged_df[['trade_date', 'close', 'Predicted_Close']]\n",
    "print(prediction_table)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6NatG2eeeSalS5dm7ty5NG3alMGDB7NmzRoWLFhAbGwsu3btolSpUrz55pv88ccflClTJt3ttmnThvj4eJxzDBkyhP79+zNgwIA011+0aNGJdIz03HjjjQwcOJD27dvz7LPP8vzzz/P222/z6quvsnr1avLnz8+ePXsAePnllzn33HP55JNP2LNnDy1atKBz584ULlw4w/0Ei/U0G2OMMeaEo0fhxhvh2Wdh1ixYsiTcLTJpGTly5Ime2WuuueZEisaECRO44447iI3VvtFSpUplabsbNmyga9eunHXWWbz++ussXrzY77bu3buXPXv20L59ewBuuukmpk6dCkCDBg247rrr+OKLL060efz48bz66qs0atSIDh06cOTIEdatW+d3O/xhPc3GGGOMAWDXLrj0Upg6FXr1giFDYNEiaNIk3C2LbBn1CAfDrl27mDRpEgsXLsQ5R2JiIs45Xn/99UxvI3nJteT1ivv06cNDDz3ERRddxOTJk+nXr1+626lXrx5z586lYcOGWX4dAGPGjGHq1Kn8/PPPvPzyyyxcuBAR4bvvvqNWrVrZ2mYwWE+zMcYYY1i5Elq2hPh4GDECPvwQ8ufXoNlEnlGjRnHDDTewdu1a1qxZw/r164mLi2PatGl06dKFQYMGkZCQAGiADVC0aFH2799/Yhvly5dn6dKlJCUl8cMPP5xYvnfvXipVqgTA8OHDM2xL3759eeWVV1ixYgUASUlJfPTRRynWKV68OCVLlmTatGkAfP7557Rv356kpCTWr19Px44dee2119i7dy8HDhyga9euDBw4EBEBYP78+dk9VAFjQbMxxhiTy82YoQHzzp0wcSL07AmxsVCnjgXNkWrkyJFceumlKZZdfvnljBw5kl69elG1alUaNGhAw4YNGTFiBAC9e/emW7duJwYCvvrqq3Tv3p1WrVpRsWLFE9vp168fV155JU2bNs0w/xk0veLtt9+mZ8+e1KlTh/r16/Pff/+dst7w4cPp27cvDRo0YMGCBTz77LMkJiZy/fXXc9ZZZ9G4cWPuu+8+SpQowTPPPMPx48dp0KAB9erV45lnnvHncAWE80bwkaxZs2YyZ86ccDfDGGOMyXG+/hpuugmqVoUxY6BmzZOP3XADTJkCYU4ljUhLly6lTp064W6G8ZOv8+icmysizVKvaz3NxhhjTC4kAq+8AtdcA82b66C/5AEzQP36sH497N0bnjYaE0ksaDbGGGNymePHdaDfU0/BtdfChAlQuvSp69Wvr/cBKJ5gTNSzoNkYY4zJRfbsgfPPh08+0bJyX3yhA/588QbNltdsjJWcM8YYY3KN1avhwgu1Usbw4VqPOT1Vq0KRIhY0GwMWNBtjjDG5wuzZcNFFcOwYjB8PHTpk/BzntLfZgmZjLD3DGGOMyfG++06D5MKFdcBfZgJmL59B87FjkJQUwBYaE/mCFjQ752o55xYku+1zzj3gnHvdObfMOfePc+4H51yJYLXBGGOMyc1E4I034MoroVEj7W2uXTtr26hfH7Zvh23bPAs2bIB69eDOOwPdXJNFMTExNGrUiPr163PllVdy6NChbG/r5ptvZtSoUQD06tWLJenMnz558mRmzpyZ5X1Uq1aNHTt2nLL8wIED3HHHHVSvXp2mTZvSoUMHZs+eDUCRIkWyvJ9gCVrQLCLLRaSRiDQCmgKHgB+A34H6ItIAWAE8Eaw2GGOMMblVQgLcdRf07QtXXAGTJkHZslnfTorBgFu2QKdOmhQ9b15A22uyrmDBgixYsIBFixaRL1++U2bh884ImFVDhgyhbt26aT6e3aA5Lb169aJUqVL8+++/zJ07l2HDhvkMrsMtVOkZnYBVIrJWRMaLiPcsxgOVQ9QGY4wxJlfYtw+6d4dBg+Dxx+Grr6Bgwextyxs0r4rfrgHzxo3QqpWOKjQRo23btqxcuZLJkyfTtm1bLrroIurWrUtiYiJ9+/alefPmNGjQgEGDBgEgItx7773UqlWLzp07s+3EpQTo0KED3knlfv31V5o0aULDhg3p1KkTa9as4aOPPuKtt96iUaNGTJs2je3bt3P55ZfTvHlzmjdvzowZMwDYuXMn5513HvXq1aNXr174mlBv1apVzJ49m5deeok8eTQsjYuL48ILL0yxnojQt29f6tevz1lnncXXX38NwObNm2nXrt2JHnfvNN3jx4+nZcuWNGnShCuvvJIDBw74fYxDNRDwGmCkj+W3Al/7eoJzrjfQG6Bq1arBa5kxxhiTg6xfrxUyliyBjz/Wesz+KFcOqpfaTdc3z4OD/8G4cfDnnzBzps56Urx4YBoezR54ABYsCOw2GzWCt9/O1KoJCQmMGzeObt26ATBv3jwWLVpEXFwcgwcPpnjx4vz1118cPXqU1q1bc9555zF//nyWL1/OkiVL2Lp1K3Xr1uXWW29Nsd3t27dz++23M3XqVOLi4ti1axelSpXizjvvpEiRIjzyyCMAXHvttTz44IO0adOGdevW0bVrV5YuXcrzzz9PmzZtePbZZxkzZgxDhw49pe2LFy+mUaNGxMTEpPsav//+exYsWMDff//Njh07aN68Oe3atWPEiBF07dqVp556isTERA4dOsSOHTt46aWXmDBhAoULF+a1117jzTff5Nlnn83U8UxL0INm51w+4CJSpWE4554CEoAvfT1PRAYDg0Gn0Q5yM40xxpioN3cu9OgBBw9qbNuli//bdPv38fPxrlQ4sATGjdZRhNu364OrV2twZ8Li8OHDNPIc/7Zt23Lbbbcxc+ZMWrRoQVxcHKA9rv/888+JfOW9e/fy77//MnXqVHr27ElMTAynnXYa55577inbj4+Pp127die2VapUKZ/tmDBhQooc6H379nHgwAGmTp3K999/D8CFF15IyZIls/1ap0+ffqK95cuXp3379vz11180b96cW2+9lePHj3PJJZfQqFEjpkyZwpIlS2jdujUAx44do2XLltnet1coeprPB+aJyFbvAufczUB3oJP46qs3xhhjjE///Qfz52t6cerbokXaMzxzpo7V89uBA3DBBZx5cD4983/P1+d1xQF4gigLmj0y2SMcaN6c5tQKFy584mcRYeDAgXTt2jXFOmPHjg1YO5KSkoiPj6dAgQJZfm69evX4+++/SUxMzLC32Zd27doxdepUxowZw80338xDDz1EyZIl6dKlCyNH+kpyyL5Q5DT3JFlqhnOuG/AocJGIZH+YpzHGGJPLJCZCy5Y6sO/ee+GVV+CXX7SgRZkycPPNWiEjIAHzvn1a2HnWLCbeNpJvj/Rg3TrPY8mDZhPRunbtyocffsjx48cBWLFiBQcPHqRdu3Z8/fXXJCYmsnnzZv74449TnnvOOecwdepUVnvO865duwAoWrQo+/fvP7Heeeedx8CBA0/87g3kvekTAOPGjWP37t2n7KN69eo0a9aM55577kTO85o1axgzZkyK9dq2bXuivdu3b2fq1Km0aNGCtWvXUr58eW6//XZ69erFvHnzOOecc5gxYwYrV64E4ODBg6xYsSJbxy+5oPY0O+cKA12AO5Itfg/ID/zunAOIFxGrW2OMMcZkID5eS7+9+y5cdZUGytnonEub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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# 设置图形大小\n",
    "plt.figure(figsize=(12, 6))\n",
    "\n",
    "# 绘制实际股价\n",
    "plt.plot(merged_df['trade_date'], merged_df['close'], label='Actual Close', color='blue')\n",
    "\n",
    "# 绘制各个模型的预测股价\n",
    "plt.plot(merged_df['trade_date'], merged_df['Predicted_Close'], label='Predicted Close', color='red')\n",
    "\n",
    "# 设置图例和标题\n",
    "plt.legend()\n",
    "plt.title('Actual vs Predicted Close Price')\n",
    "plt.xlabel('Date')\n",
    "plt.ylabel('Close Price')\n",
    "\n",
    "# 自动旋转日期标签，使其更易读\n",
    "plt.gcf().autofmt_xdate()\n",
    "\n",
    "# 显示图形\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 将 y_test 和 y_pred 转换为相同的 DataFrame 索引\n",
    "y_test_series = pd.Series(y_test.values, index=X_test.index)\n",
    "y_pred_series = pd.Series(y_pred, index=X_test.index)\n",
    "\n",
    "# 计算残差\n",
    "residuals = y_test_series - y_pred_series\n",
    "\n",
    "# 绘制残差图\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.scatter(y_test_series, residuals)\n",
    "plt.axhline(y=0, color='r', linestyle='--')\n",
    "plt.xlabel('Actual Close Price')\n",
    "plt.ylabel('Residuals')\n",
    "plt.title('Residual Plot')\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "残差图（Residual Plot）显示了实际股价与预测股价之间的差异（残差）。水平轴代表实际股价，垂直轴代表残差（预测值与实际值的差异）。理想情况下，残差应围绕零随机分布。如果存在明显的模式或趋势，可能表明模型存在系统性误差。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
